import actionInterceptorPool from "./ActionInterceptorPool";
import {ActionMapValueType} from "../action/ActionMethodsBase";
import ActionParam from "../action/ActionParam";

class ActionInterceptorActuator {
    /**
     * 执行 load 拦截器
     * @param {ActionParam} actionParam 控制器参数
     */
    doLoad(actionParam: ActionParam) {
        for (let interceptor of actionInterceptorPool.interceptors) {
            if (interceptor.loadHandle) {
                // 执行拦截器
                const res = interceptor.loadHandle(actionParam)
                if (!res) {
                    // 如果拦截器返回 false 则直接返回结果
                    return false
                }
            }
        }
        return true
    }

    /**
     * 执行 before 拦截器
     * @param {ActionParam} actionParam 控制器参数
     * @param {ActionMapValueType} routeInfo 路由信息
     */
    doBefore(actionParam: ActionParam, routeInfo: ActionMapValueType) {
        for (let interceptor of actionInterceptorPool.interceptors) {
            if (interceptor.beforeHandle) {
                // 执行拦截器
                const res = interceptor.beforeHandle(actionParam, routeInfo)
                if (!res) {
                    // 如果拦截器返回 false 则直接返回结果
                    return false
                }
            }
        }
        return true
    }

    /**
     * 执行 after 拦截器
     * @param {ActionParam} actionParam 控制器参数
     * @param {ActionMapValueType} routeInfo 路由信息
     * @param {any} [handleResult] 执行处理方法后的结果
     */
    doAfter(actionParam: ActionParam, routeInfo: ActionMapValueType, handleResult?: any) {
        for (let interceptor of actionInterceptorPool.interceptors) {
            if (interceptor.afterHandle) {
                // 执行拦截器
                const res = interceptor.afterHandle(actionParam, routeInfo, handleResult);
                if (!res) {
                    // 如果拦截器返回 false 则直接返回结果
                    return false
                }
            }
        }
        return true
    }
}

const actionInterceptorActuator = new ActionInterceptorActuator();
export default actionInterceptorActuator
